import { defaultCollectList } from '@/common/constant';

export interface Collect {
  url: string;
  name: string;
  timestamp: number;
}

export type CollectList = Collect[];

/** 存储的键 */
export enum StorageKey {
  /** 收藏列表 */
  QRCODE_COLLECT_LIST = 'QRCODE_COLLECT_LIST',
}

/** 定义一个映射，用于将 `StorageKey` 映射到相应的数据类型 */
type StorageMap = {
  [StorageKey.QRCODE_COLLECT_LIST]: CollectList;
};

/**
 * 获取指定 `storage` 的值
 * @param key 存储的键，只能是 `StorageKey` 枚举中的键
 * @returns 对应的存储数据
 */
export function getStorage<T extends StorageKey>(key: T) {
  return new Promise<StorageMap[T]>((resolve) => {
    const parse = (res: null | string) => resolve(res ? JSON.parse(res) : null);
    try {
      chrome.storage.local.get([key], (res) => parse(res[key]));
    } catch (err) {
      parse(localStorage.getItem(key));
    }
  });
}

/**
 * 设置指定 `storage` 的值
 * @param key 存储的键，只能是 `StorageKey` 枚举中的键
 * @param data 要存储的数据，对应于键所映射的数据类型
 */
export function setStorage<T extends StorageKey>(key: T, data: StorageMap[T]) {
  return new Promise((resolve) => {
    const cb = () => getStorage(key).then(resolve);
    try {
      chrome.storage.local.set({ [key]: JSON.stringify(data) }, cb);
    } catch (err) {
      localStorage.setItem(key, JSON.stringify(data));
      cb();
    }
  });
}

/**
 * 获取指定数据，无则初始化
 */
async function initStorage<T extends StorageKey>(key: T, defaultData: StorageMap[T]) {
  const res = await getStorage(key);
  // 如果数据存在，直接返回，否则初始化数据并返回
  if (res) return res;
  await setStorage(key, defaultData);
  return defaultData;
}

/**
 * 获取收藏列表
 */
export function getCollectList() {
  return initStorage(StorageKey.QRCODE_COLLECT_LIST, defaultCollectList);
}

/**
 * 设置收藏列表
 * @param list 收藏列表数据
 */
export function setCollectList(list: CollectList) {
  return setStorage(StorageKey.QRCODE_COLLECT_LIST, list);
}
